#include <REGX52.H>
#include <INTRINS.H>
#include "OneWire.h"
#include "UART.h"
#include "LCD1602.h"

#define DS18B20_SKIPROM				0xCC
#define DS18B20_CONVERT_T			0x44
#define DS18B20_READ_SCRATCHPAD		0xBE

/**
  * @brief  发送命令字通知DS18B20采集温度传感器数据并存放在暂存器中以便接下来读取
  * @param  无
  * @retval 无
  */
void DS18B20_ConvertT(void)
{
	OneWire_Init();
	
	OneWire_SendByte(DS18B20_SKIPROM);		//0xCC  1100 1100
	OneWire_SendByte(DS18B20_CONVERT_T);	//0x44	0100 0100
}

/**
  * @brief  发送命令字读取DS18B20中暂存器中的温度传感器的数据
  * @param  无
  * @retval 浮点数温度值
  */
float DS18B20_ReadTemperature(void)
{
	float T;
	int tempert;
	unsigned char TLSB;
	unsigned char TMSB;
	
	OneWire_Init();
	OneWire_SendByte(DS18B20_SKIPROM);				//0xCC  1100 1100
	OneWire_SendByte(DS18B20_READ_SCRATCHPAD);		//
	TLSB = OneWire_ReceiveByte();
	TMSB = OneWire_ReceiveByte();
	
	tempert = (TMSB << 8) | TLSB;		//TLSB和TMSB组合为int型，因为温度的低4位为小数，所以相当于左移了4位
	T = tempert/16.0;					//除以16.0得到小数
	
	return T;
}

/**
  * @brief  发送命令字读取DS18B20中暂存器中的温度传感器的数据
  * @param  无
  * @retval 温度传感器的高8位和低8位组成的原始数据，调用者需要处理分析符号位和低4位的小数部分
  */
int DS18B20_ReadT(void)
{
	int tempert;
	unsigned char TLSB;
	unsigned char TMSB;
	
	OneWire_Init();
	OneWire_SendByte(DS18B20_SKIPROM);				//0xCC  1100 1100
	OneWire_SendByte(DS18B20_READ_SCRATCHPAD);		//
	TLSB = OneWire_ReceiveByte();
	TMSB = OneWire_ReceiveByte();
	
	tempert = (TMSB << 8) | TLSB;		//TLSB和TMSB组合为int型，因为温度的低4位为小数，所以相当于左移了4位
	
	return tempert;
}

